import { getSetting,chooseAddress,openSetting,showModal,showToast } from "../../utils/asyncWx.js";

  /**
   * 1 获取用户的收货地址
   *    1 绑定点击事件
   *    2 调用小程序内置 api 获取用户的收货地址 wx.chooseAddress(有bug)
   *    2 获取用户对小程序所授予 获取地址的权限 状态 scope
   *      1 假设 用户 点击获取收获地址的提示框 确定  authSetting  scope.address
   *          scope 值 true       可以直接调用收货地址
   *    * 2 假设用户 从来没有调用过 收获地址的api  没有scope.address这个值  scope值就是undefined
   *          scope 值 undefined  可以直接调用收货地址
   *      3 假设用户  点击获取收获地址的提示框 取消 authSetting: {scope.address: false}
   *          scope 值 false   
   *          1 诱导用户自己打开授权设置页面wx.openSetting 当用户重新给与 获取地址权限的时候
   *          2 获取收获地址
          4 把获取到的收获地址 存入到本地存储中
   * 2 页面加载完毕 onLoad onShow
        1 获取本地存储中的地址数据
        2 把数据 设置给data中的一个变量
     3 onShow 
       0 回到商品的详情页面 第一次添加商品的时候手动添加了属性
          1 num=1
          2 checked=true
       1 获取缓存中的购物车数组
       2 把购物车数据填充到data中
     4 全选实现 数据的展示
       1 onshow获取缓存的购物车书资
       2 根据购物车中的商品数据 所有商品都被选中checked=true 全选就被选中
     5 总价格和总数量
       1 都需要商品被选中 我们才拿它来计算
       2 获取购物车数组
       3 遍历
       4 判定商品是否被选中
       5 总价格 += 商品的单价 * 商品的数量
         总数量 += 商品的数量
       6 把计算后的价格和数量 设置回data中即可
      6 商品的选中
        1 绑定change事件
        2 获取到被修改的商品对象  
        3 商品对象的选中状态 取反
        4 重新填充回data中和缓存中
        5 重新计算全选 总价值 总数量
      7 全选和反选
        1 全选复选框绑定事件change
        2 获取 data中的全选变量 allChecked
        3 取反 allChecked=！allChecked
        4 遍历购物车数组，让里面的商品选中状态跟随allChecked改变而改变
        5 把购物车数组 和allChecked 重新设置回data 把购物车重新送回缓存中
      8 商品数量的编辑功能
        1 “+”“-”按钮绑定同一个点击事件 区分的关键使是自定义属性
          1 点“+” 的时候它的属性就是加“+1”
          2 点“-” 的时候它的属性就是减“-1”
        2 传递被点击的商品的id goods_id
        3 获取data中的购物车数组 来获取需要被修改的商品对象
        4 当购物车商品的数量等于1 同时点击了“-”
          弹窗提示 wx-showModle 询问 是否删除
            确定 直接执行删除
            取消什么都不做
        5 直接修改商品对象的数量属性 num
        6 把cart重新设置会缓存和data中 this.setCart
       9 点击结算 
        1 有没有收获地址信息
        2 判断用户有没有选购商品
        3 经过以上验证 跳转到支付页面！

  */
Page({
  data:{
    address:{},
    cart:[],
    allChecked:false,
    totalPrice:0,
    totalNum:0
  },
  onShow(){
    // 1 获取缓存中的收货地址
      const address = wx.getStorageSync("address");
   
    // 1 获取缓存中的购物车数据
    const cart=wx.getStorageSync("cart")||[]; 
    //1计算全选
    //every 数组方法 会便利 会接收一个回调函数 那么每一个回调函数都有返回true
    //那么every()的返回值为true 只要有一个回调函数返回了false 那么不再循环了直接返回false
    //空数组调用了every()返回值就是true
      // const allChecked =cart.length?cart.every(v=>v.checked):false;
      this.setData({address})
      this.setCart(cart);
  },

     //点击收货地址
     async handleChooseAddress(){
      try{
   
      // 1获取权限状态
      const res1 = await getSetting();
      // 2获取权限状态  
      const scopeAddress = res1.authSetting["scope.address"];
      // 3判断 权限状态
      if(scopeAddress=== false){
      // 4诱导用户打开授权页面
      await openSetting();
      }
      // 5调用获取收取地址的api
      let address = await chooseAddress();
      address.all=address.provinceName+address.cityName+address.countyName+address.detailInfo;
      
      //存入到缓存中
      wx.setStorageSync("address", address);
}catch (error) {
  console.log(error);
}
},
//商品的选中
handleItemChange(e){
  //1. 获取被修改的商品id
  
   const goods_id=e.currentTarget.dataset.id;
  // 2.获取购物车数组
    let{cart} = this.data;
  // 3.找到被修改的商品对象
    let index=cart.findIndex(v=>v.goods_id===goods_id);
  // 4.选中状态取反  
    cart[index].checked=!cart[index].checked;
    this.setCart(cart);
  
},
//设置购物车状态 同时计算底部工具栏数据
  setCart(cart){ 
    //7 重新计算全选
    let allChecked = true;
    // 1总价格 总数量
        let totalPrice=0;
        let totalNum=0;
        cart.forEach(v=>{
          if(v.checked){
            totalPrice+=v.num*v.goods_price;
            totalNum+=v.num;
          }else{
            allChecked=false;
          }
        })
        //判断数组是否为空
        allChecked=cart.length!=0?allChecked:false;
        this.setData({
          cart,
          totalPrice,
          totalNum,
          allChecked
        });
        wx.setStorageSync("cart",cart);
  },
  //商品全选功能
  handleItemAllCheck(){
    // 1.获取data中的数据
   let {cart,allChecked} = this.data;
    //2.修改值
    allChecked=!allChecked;
    //3.循环修改cart数组中的商品选中状态
    cart.forEach(v=>v.checked=allChecked);
    //4.修改后的值填充回data和缓存中
    this.setCart(cart);
  },
  //商品数量编辑功能
 async handleItemNumEdit(e){
    // 1获取传递过来的参数
    const {operation,id}=e.currentTarget.dataset;
    // 2获取购物车数组
    let {cart} = this.data;
    // 3找到需要修改商品的索引
    const index=cart.findIndex(v=>v.goods_id===id);
    //4判断是否要执行删除
      if(cart[index].num===1&&operation===-1){
        const result=await showModal({content:"是否删除？"});
        if(result.confirm){
          cart.splice(index,1);
          this.setCart(cart);
        }
      }else{
             // 4进行修改数量
            cart[index].num+=operation;
             // 5设置回缓存和data中
            this.setCart(cart);
      }
      
           
                    

  },
  async handlePay(){
  // 1 判断收获地址
  const {address ,totalNum} = this.data;
  if(!address.userName){
    await showToast({title:"您还没有选择收获地址"})
    return;
  }
  //2 判断用户有没有选购商品
   if(totalNum===0){
    await showToast({title:"您还没有选择商品"})
     return;
   }
   //3 跳转到支付页面
   wx.navigateTo({
     url: '/pages/pay/pay'
   });
  }
})